package co.edu.aes.patrones.dispatcher.despachador;

import co.edu.aes.patrones.dispatcher.receptor.Receptor;
import co.edu.aes.patrones.forwardreceiver.configuracion.ConstantesConfiguracion;
import co.edu.aes.patrones.forwardreceiver.utilidades.ComunicacionException;
import co.edu.aes.patrones.forwardreceiver.utilidades.TipoComunicacion;
import co.edu.aes.patrones.forwardreceiver.utilidades.Utilidades;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 * Clase encargada de ser el Despachador (Dispatcher) de los clientes.
 * En el cual se registran y se eliminan los clientes para realizar su comunicación de cambio de frecuencia.
 * Utiliza un Almacén de direcciones.
 * @author Alejandro León
 * @author Alejandro Peña
 * @author Diego Escobar.
 */
public class Despachador {

    public static void main(String[] args) {

        try {
            Properties prop = Utilidades.obtenerConfiguracion();

            String puertoTCP = prop.getProperty(ConstantesConfiguracion.PUERTO_TCP.getValor());
            try {
                Integer.parseInt(puertoTCP);
            } catch (NumberFormatException nfe) {
                Logger.getLogger(Despachador.class.getName()).log(Level.SEVERE, "La configuración del puerto TCP es errónea");
                System.exit(0);
            }

            String puertoUDP = prop.getProperty(ConstantesConfiguracion.PUERTO_UDP.getValor());
            try {
                Integer.parseInt(puertoUDP);
            } catch (NumberFormatException nfe) {
                Logger.getLogger(Despachador.class.getName()).log(Level.SEVERE, "La configuración del puerto UDP es errónea");
                System.exit(0);
            }

            try {
                //Se sube el hilo receptor TCP para la petición entrante de la actualización de frencuencia de algún cliente
                Receptor receptor = new Receptor(Integer.parseInt(puertoTCP), TipoComunicacion.TCP);
                Thread hiloReceptor = new Thread(receptor);
                hiloReceptor.start();

                //Se sube el hilo receptor UDP para el registro o eliminación de algún cliente.
                Receptor receptor1 = new Receptor(Integer.parseInt(puertoUDP), TipoComunicacion.UDP);
                Thread hiloReceptor2 = new Thread(receptor1);
                hiloReceptor2.start();

                int respuesta;
                do {
                    respuesta = JOptionPane.showConfirmDialog(null, "¿Parar Despachador?", "Despachador", JOptionPane.YES_OPTION);
                } while (respuesta == JOptionPane.NO_OPTION);

                //Se paran los hilos.
                hiloReceptor=null;
                hiloReceptor2=null;
                System.exit(0);
            } catch (ComunicacionException ex) {
                Logger.getLogger(Despachador.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
                System.exit(0);
            }

        } catch (IOException ioe) {
            Logger.getLogger(Despachador.class.getName()).log(Level.SEVERE, "La configuración no pudo ser cargada. Revisar archivo de configuración \"Configuracion.properties\"");
            System.exit(0);
        }
    }
}
